Load packages
library(tidyverse)
── Attaching core tidyverse packages ─────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.2 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.2 ✔ tibble 3.2.1
✔ lubridate 1.9.2 ✔ tidyr 1.3.0
✔ purrr 1.0.1 ── Conflicts ───────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(lubridate)
library(hms)
Attaching package: ‘hms’
The following object is masked from ‘package:lubridate’:
hms
library(googlesheets4)
library(readxl)
#ppl_15mins <- ppl_15mins %>% rename(date = Date)
hourly_ppl_pivot <- ppl_15mins %>%
rename(date = Date) %>%
pivot_longer(!c("Account Number", "Meter Number", date, "Read Type", Min, Max, Total), names_to = "time", values_to = "kWh")
#ppl_15mins %>% mutate(date = as_date(Date))
rename(ppl_15mins, date = Date)
#rm(hourly_pivot)
hourly_ppl_pivot <- hourly_ppl_pivot %>%
mutate(time = parse_time(time, '%H:%M %p'), month = month(date, label=TRUE), year = year(date), yday = yday(date), wday = wday(date, label=TRUE))
(hourly_ppl_net <- hourly_ppl_pivot %>%
filter(`Read Type` == "kWh Net"))
Import solar production from another notebook (EnphaseHourly.Rmd)
ggplot(hourly_production, aes(datetime, energy_produced_Wh)) +
geom_point()

ggplot(hourly_production, aes(time, energy_produced_Wh)) +
theme(axis.text.x = element_text(angle = 90)) +
geom_point()

ggplot(hourly_production, aes(datetime, energy_produced_Wh)) +
geom_point()

ggplot(hourly_production, aes(time, energy_produced_Wh)) +
theme(axis.text.x = element_text(angle = 90)) +
geom_point()

Net + Produced = Consumedggplot(hourly_production, aes(datetime,
energy_produced_Wh)) +
geom_point()
ggplot(hourly_production, aes(time, energy_produced_Wh)) +
theme(axis.text.x = element_text(angle = 90)) +
geom_point()
# hourly_ppl_net <- hourly_ppl_net %>% mutate(date = as_date(date))
hourly_ppl_net %>% arrange(desc(date))
hourly_production %>% arrange(desc(date))
(hourly_electricity <- hourly_ppl_net %>%
inner_join(hourly_production, by = join_by(date,time)) %>%
mutate(consumed_kWh = kWh + energy_produced_Wh/1000, produced_kWh = energy_produced_Wh/1000) %>%
rename(net_kWh = kWh) %>%
select(datetime, date, time, net_kWh, produced_kWh, consumed_kWh))
NA
ggplot(hourly_electricity, aes(x=time)) +
geom_point(aes(y=consumed_kWh,color="red"))

ggplot(hourly_electricity, aes(x=datetime)) +
geom_point(aes(y=consumed_kWh,color="red"))

hourly_electricity %>% summarize(min_date = min(date), max_date = max(date))
electricity_by_time <- hourly_electricity %>%
filter(date <= as.POSIXct('12/31/2022 00:00',format="%m/%d/%Y %H:%M",tz=Sys.timezone()) ) %>%
group_by(time) %>%
summarize(produced_kWh = mean(produced_kWh), consumed_kWh = mean(consumed_kWh), net_kWh = mean(net_kWh)) %>%
arrange(time)
electricity_by_time
ggplot(electricity_by_time, aes(x=time)) +
geom_point(aes(y=consumed_kWh, color="Consumed")) +
geom_point(aes(y=net_kWh, color="Net")) +
geom_point(aes(y=produced_kWh*-1, color="Produced")) +
labs(colour="",x="Time of Day",y="Electricity Consumption (kWh)")+
scale_color_manual(values = c("red","black","green")) +
ggtitle("Home Electricity in 15-Minute Intervals (Apr 15 - Dec 31, 2022)")

electricity_by_month_time <- hourly_electricity %>%
mutate(month = as_factor(month(date))) %>%
filter(date <= as.POSIXct('12/31/2022 00:00',format="%m/%d/%Y %H:%M",tz=Sys.timezone()) ) %>%
group_by(month, time) %>%
summarize(produced_kWh = mean(produced_kWh), consumed_kWh = mean(consumed_kWh), net_kWh = mean(net_kWh)) %>%
arrange(month, time)
`summarise()` has grouped output by 'month'. You can override using the `.groups` argument.
ggplot(electricity_by_month_time, aes(time, consumed_kWh, group=month, color=month)) +
geom_point() +
ggtitle("Home Electricity in 15-Minute Intervals (Apr 15 - Dec 31, 2022)") +
ylab("Net Electricity Consumption (kWh)")

NA
NA
Example day with EV charging
#hourly_electricity
march23 <- hourly_electricity %>%
filter(date >= "2023-04-01" & date < "2023-04-06")
ggplot(march23) +
geom_point(aes(datetime,net_kWh))

ggplot(march23) +
geom_point(aes(time,net_kWh, color = factor(date)))

LS0tCnRpdGxlOiAiSG91cmx5IEVsZWN0cmljaXR5IENvbnN1bXB0aW9uIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpMb2FkIHBhY2thZ2VzCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoaG1zKQpsaWJyYXJ5KGdvb2dsZXNoZWV0czQpCmxpYnJhcnkocmVhZHhsKQpgYGAKCgpgYGB7cn0KCiNnczRfZGVhdXRoKCkKI3BwbF8xNW1pbnMgPC0gcmVhZF9zaGVldCgiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMXV2NVNCWWtsUS1iQXJDbldQVkcxaE92S3UzZnBnRDFzZ1U4YlRaOHNSNW8vZWRpdD91c3A9c2hhcmluZyIpCiNhZGQgY29sdW1uIHR5cGVzCgoKY29sX2RhdGF0eXBlcyA8LSBjKCdudW1lcmljJywnbnVtZXJpYycsJ2RhdGUnLCd0ZXh0JyxyZXAoJ251bWVyaWMnLDk5KSkKCiM/cmVhZF9leGNlbAoKaG91cmx5MSA8LSByZWFkX2V4Y2VsKCJIb3VybHkgVXNhZ2UgMjIwMzI2IHRvIDIyMDYyNC54bHN4IiwgY29sX3R5cGVzID0gY29sX2RhdGF0eXBlcykKaG91cmx5MiA8LSByZWFkX2V4Y2VsKCJIb3VybHkgVXNhZ2UgMjIwNjI1IHRvIDIzMDYyMy54bHN4IiwgY29sX3R5cGVzID0gY29sX2RhdGF0eXBlcykKaG91cmx5MyA8LSByZWFkX2V4Y2VsKCJIb3VybHkgVXNhZ2UgMjMwNjI0IHRvIDIzMTEyMS54bHN4IiwgY29sX3R5cGVzID0gY29sX2RhdGF0eXBlcykKCmhvdXJseTEKaG91cmx5Mgpob3VybHkzCgpwcGxfMTVtaW5zIDwtIGJpbmRfcm93cyhob3VybHkxLGxpc3QoaG91cmx5Mixob3VybHkzKSkKCnBwbF8xNW1pbnMgJT4lIGFycmFuZ2UoZGVzYyhEYXRlKSwgYFJlYWQgVHlwZWApCgoKYGBgCgoKYGBge3J9CiNwcGxfMTVtaW5zIDwtIHBwbF8xNW1pbnMgJT4lIHJlbmFtZShkYXRlID0gRGF0ZSkKCmhvdXJseV9wcGxfcGl2b3QgPC0gcHBsXzE1bWlucyAlPiUgCiAgcmVuYW1lKGRhdGUgPSBEYXRlKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKCFjKCJBY2NvdW50IE51bWJlciIsICJNZXRlciBOdW1iZXIiLCBkYXRlLCAiUmVhZCBUeXBlIiwgTWluLCBNYXgsIFRvdGFsKSwgbmFtZXNfdG8gPSAidGltZSIsIHZhbHVlc190byA9ICJrV2giKSAKCiNwcGxfMTVtaW5zICU+JSAgbXV0YXRlKGRhdGUgPSBhc19kYXRlKERhdGUpKSAKCnJlbmFtZShwcGxfMTVtaW5zLCBkYXRlID0gRGF0ZSkKCiNybShob3VybHlfcGl2b3QpCgpob3VybHlfcHBsX3Bpdm90IDwtIGhvdXJseV9wcGxfcGl2b3QgJT4lIAogIG11dGF0ZSh0aW1lID0gcGFyc2VfdGltZSh0aW1lLCAnJUg6JU0gJXAnKSwgbW9udGggPSBtb250aChkYXRlLCBsYWJlbD1UUlVFKSwgeWVhciA9IHllYXIoZGF0ZSksIHlkYXkgPSB5ZGF5KGRhdGUpLCB3ZGF5ID0gd2RheShkYXRlLCBsYWJlbD1UUlVFKSkKCihob3VybHlfcHBsX25ldCA8LSBob3VybHlfcHBsX3Bpdm90ICU+JSAKICBmaWx0ZXIoYFJlYWQgVHlwZWAgPT0gImtXaCBOZXQiKSkKYGBgCgpJbXBvcnQgc29sYXIgcHJvZHVjdGlvbiBmcm9tIGFub3RoZXIgbm90ZWJvb2sgKEVucGhhc2VIb3VybHkuUm1kKQoKYGBge3J9CmdncGxvdChob3VybHlfcHJvZHVjdGlvbiwgYWVzKGRhdGV0aW1lLCBlbmVyZ3lfcHJvZHVjZWRfV2gpKSArCiAgZ2VvbV9wb2ludCgpCgpnZ3Bsb3QoaG91cmx5X3Byb2R1Y3Rpb24sIGFlcyh0aW1lLCBlbmVyZ3lfcHJvZHVjZWRfV2gpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsKICBnZW9tX3BvaW50KCkKYGBgCgpgYGB7cn0KZ2dwbG90KGhvdXJseV9wcm9kdWN0aW9uLCBhZXMoZGF0ZXRpbWUsIGVuZXJneV9wcm9kdWNlZF9XaCkpICsKICBnZW9tX3BvaW50KCkKCmdncGxvdChob3VybHlfcHJvZHVjdGlvbiwgYWVzKHRpbWUsIGVuZXJneV9wcm9kdWNlZF9XaCkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKwogIGdlb21fcG9pbnQoKQpgYGAKCk5ldCArIFByb2R1Y2VkID0gQ29uc3VtZWRnZ3Bsb3QoaG91cmx5X3Byb2R1Y3Rpb24sIGFlcyhkYXRldGltZSwgZW5lcmd5X3Byb2R1Y2VkX1doKSkgKwoKICBnZW9tX3BvaW50KCkKCmdncGxvdChob3VybHlfcHJvZHVjdGlvbiwgYWVzKHRpbWUsIGVuZXJneV9wcm9kdWNlZF9XaCkpICsKCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsKCiAgZ2VvbV9wb2ludCgpCmBgYHtyfQoKIyBob3VybHlfcHBsX25ldCA8LSBob3VybHlfcHBsX25ldCAlPiUgbXV0YXRlKGRhdGUgPSBhc19kYXRlKGRhdGUpKQoKaG91cmx5X3BwbF9uZXQgJT4lIGFycmFuZ2UoZGVzYyhkYXRlKSkKaG91cmx5X3Byb2R1Y3Rpb24gJT4lIGFycmFuZ2UoZGVzYyhkYXRlKSkKCgooaG91cmx5X2VsZWN0cmljaXR5IDwtIGhvdXJseV9wcGxfbmV0ICU+JSAKICAgIGlubmVyX2pvaW4oaG91cmx5X3Byb2R1Y3Rpb24sIGJ5ID0gam9pbl9ieShkYXRlLHRpbWUpKSAgJT4lIAogICAgbXV0YXRlKGNvbnN1bWVkX2tXaCA9IGtXaCArIGVuZXJneV9wcm9kdWNlZF9XaC8xMDAwLCBwcm9kdWNlZF9rV2ggPSBlbmVyZ3lfcHJvZHVjZWRfV2gvMTAwMCkgICU+JSAKICAgIHJlbmFtZShuZXRfa1doID0ga1doKSAlPiUgCiAgICBzZWxlY3QoZGF0ZXRpbWUsIGRhdGUsIHRpbWUsIG5ldF9rV2gsIHByb2R1Y2VkX2tXaCwgY29uc3VtZWRfa1doKSkKCmBgYAoKYGBge3J9CmdncGxvdChob3VybHlfZWxlY3RyaWNpdHksIGFlcyh4PXRpbWUpKSArCiAgZ2VvbV9wb2ludChhZXMoeT1jb25zdW1lZF9rV2gsY29sb3I9InJlZCIpKSAKCmdncGxvdChob3VybHlfZWxlY3RyaWNpdHksIGFlcyh4PWRhdGV0aW1lKSkgKwogIGdlb21fcG9pbnQoYWVzKHk9Y29uc3VtZWRfa1doLGNvbG9yPSJyZWQiKSkgCmBgYAoKYGBge3J9Cgpob3VybHlfZWxlY3RyaWNpdHkgJT4lIHN1bW1hcml6ZShtaW5fZGF0ZSA9IG1pbihkYXRlKSwgbWF4X2RhdGUgPSBtYXgoZGF0ZSkpCgplbGVjdHJpY2l0eV9ieV90aW1lIDwtIGhvdXJseV9lbGVjdHJpY2l0eSAlPiUgCiAgZmlsdGVyKGRhdGUgPD0gYXMuUE9TSVhjdCgnMTIvMzEvMjAyMiAwMDowMCcsZm9ybWF0PSIlbS8lZC8lWSAlSDolTSIsdHo9U3lzLnRpbWV6b25lKCkpICkgJT4lIAogIGdyb3VwX2J5KHRpbWUpICU+JSAKICBzdW1tYXJpemUocHJvZHVjZWRfa1doID0gbWVhbihwcm9kdWNlZF9rV2gpLCBjb25zdW1lZF9rV2ggPSBtZWFuKGNvbnN1bWVkX2tXaCksIG5ldF9rV2ggPSBtZWFuKG5ldF9rV2gpKSAlPiUgCiAgYXJyYW5nZSh0aW1lKQoKZWxlY3RyaWNpdHlfYnlfdGltZQoKZ2dwbG90KGVsZWN0cmljaXR5X2J5X3RpbWUsIGFlcyh4PXRpbWUpKSArCiAgZ2VvbV9wb2ludChhZXMoeT1jb25zdW1lZF9rV2gsIGNvbG9yPSJDb25zdW1lZCIpKSArCiAgZ2VvbV9wb2ludChhZXMoeT1uZXRfa1doLCBjb2xvcj0iTmV0IikpICsKICBnZW9tX3BvaW50KGFlcyh5PXByb2R1Y2VkX2tXaCotMSwgY29sb3I9IlByb2R1Y2VkIikpICsKICBsYWJzKGNvbG91cj0iIix4PSJUaW1lIG9mIERheSIseT0iRWxlY3RyaWNpdHkgQ29uc3VtcHRpb24gKGtXaCkiKSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygicmVkIiwiYmxhY2siLCJncmVlbiIpKSArCiAgZ2d0aXRsZSgiSG9tZSBFbGVjdHJpY2l0eSBpbiAxNS1NaW51dGUgSW50ZXJ2YWxzIChBcHIgMTUgLSBEZWMgMzEsIDIwMjIpIikKCmBgYAoKCmBgYHtyfQplbGVjdHJpY2l0eV9ieV9tb250aF90aW1lIDwtIGhvdXJseV9lbGVjdHJpY2l0eSAlPiUgCiAgbXV0YXRlKG1vbnRoID0gYXNfZmFjdG9yKG1vbnRoKGRhdGUpKSkgJT4lIAogIGZpbHRlcihkYXRlIDw9IGFzLlBPU0lYY3QoJzEyLzMxLzIwMjIgMDA6MDAnLGZvcm1hdD0iJW0vJWQvJVkgJUg6JU0iLHR6PVN5cy50aW1lem9uZSgpKSApICU+JSAKICBncm91cF9ieShtb250aCwgdGltZSkgJT4lIAogIHN1bW1hcml6ZShwcm9kdWNlZF9rV2ggPSBtZWFuKHByb2R1Y2VkX2tXaCksIGNvbnN1bWVkX2tXaCA9IG1lYW4oY29uc3VtZWRfa1doKSwgbmV0X2tXaCA9IG1lYW4obmV0X2tXaCkpICU+JSAKICBhcnJhbmdlKG1vbnRoLCB0aW1lKQoKZ2dwbG90KGVsZWN0cmljaXR5X2J5X21vbnRoX3RpbWUsIGFlcyh0aW1lLCBjb25zdW1lZF9rV2gsIGdyb3VwPW1vbnRoLCBjb2xvcj1tb250aCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdndGl0bGUoIkhvbWUgRWxlY3RyaWNpdHkgaW4gMTUtTWludXRlIEludGVydmFscyAoQXByIDE1IC0gRGVjIDMxLCAyMDIyKSIpICsKICB5bGFiKCJOZXQgRWxlY3RyaWNpdHkgQ29uc3VtcHRpb24gKGtXaCkiKQoKCmBgYAoKRXhhbXBsZSBkYXkgd2l0aCBFViBjaGFyZ2luZwoKYGBge3J9CiNob3VybHlfZWxlY3RyaWNpdHkKCm1hcmNoMjMgPC0gaG91cmx5X2VsZWN0cmljaXR5ICU+JSAKICBmaWx0ZXIoZGF0ZSA+PSAiMjAyMy0wNC0wMSIgJiBkYXRlIDwgIjIwMjMtMDQtMDYiKQoKZ2dwbG90KG1hcmNoMjMpICsKICBnZW9tX3BvaW50KGFlcyhkYXRldGltZSxuZXRfa1doKSkKCgpnZ3Bsb3QobWFyY2gyMykgKwogIGdlb21fcG9pbnQoYWVzKHRpbWUsbmV0X2tXaCwgY29sb3IgPSBmYWN0b3IoZGF0ZSkpKQoKYGBgCgoKCgo=